package com.jms.framework.beans;

import com.jms.framework.attri.AttributeExpansion;

/**
 * Bean定义接口，扩展了属性扩展接口
 * 它定义了与Bean相关的一系列配置属性，如类名、作用域、初始化和销毁方法等
 * @author jms
 * @since 2025-01-23
 */
public interface BeanDefinition extends AttributeExpansion {

    String SCOPE_SINGLETON = "singleton";
    String SCOPE_PROTOTYPE = "prototype";

    /**
     * 获取Bean的类名
     *
     * @return Bean的类名
     */
    String getBeanClassName();

    /**
     * 设置Bean的类名
     *
     * @param beanClassName Bean的类名
     */
    void setBeanClassName(String beanClassName);

    /**
     * 获取Bean的名称
     *
     * @return Bean的名称
     */
    String getBeanName();

    /**
     * 设置Bean的名称
     *
     * @param beanName Bean的名称
     */
    void setBeanName(String beanName);

    /**
     * 设置Bean的作用域
     *
     * @param scope Bean的作用域
     */
    void setScope(String scope);

    /**
     * 获取Bean的作用域
     *
     * @return Bean的作用域
     */
    String getScope();

    /**
     * 设置Bean是否延迟初始化
     *
     * @param lazyInit 是否延迟初始化
     */
    void setLazyInit(boolean lazyInit);

    /**
     * 判断Bean是否配置为延迟初始化
     *
     * @return 如果Bean配置为延迟初始化则返回true，否则返回false
     */
    boolean isLazyInit();

    /**
     * 设置Bean的初始化方法名
     *
     * @param initMethodName 初始化方法名
     */
    void setInitMethodName(String initMethodName);

    /**
     * 获取Bean的初始化方法名
     *
     * @return 初始化方法名
     */
    String getInitMethodName();

    /**
     * 设置Bean的销毁方法名
     *
     * @param destroyMethodName 销毁方法名
     */
    void setDestroyMethodName(String destroyMethodName);

    /**
     * 获取Bean的销毁方法名
     *
     * @return 销毁方法名
     */
    String getDestroyMethodName();

    /**
     * 设置Bean的依赖Bean数组
     *
     * @param dependencies 依赖的Bean数组
     */
    void setDependencies(BeanDependency[] dependencies);

    /**
     * 获取Bean的依赖Bean数组
     *
     * @return 依赖的Bean数组
     */
    BeanDependency[] getDependencies();

    void setOrderNumber(int orderNumber);

    /**
     * 获取Bean的加载顺序
     *
     * @return 加载顺序
     */
    int getOrderNumber();

    /**
     * 设置Bean的初始化方法执行后执行
     *
     * @param afterInit 是否初始化方法执行后执行
     */
    void setAfterInit(boolean afterInit);

    /**
     * 获取Bean的初始化方法执行后执行
     *
     * @return 如果初始化方法执行后执行则返回true，否则返回false
     */
    boolean isAfterInit();
}
